import TRTC from 'trtc-js-sdk'
import streamConfig from '@/config/streamConfig'
import genSig from '@/utils/genSig'

const { audio, video } = streamConfig

// TODO 创建一个房间后，再等待其他人加入房间会有多个localStream
export default class TRTCClass {
  static remoteArr = []

  // 创建一个实时音视频通话的客户端对象，在每次会话中仅需要调用一次
  client = null
  // 创建一个本地流 Stream 对象，本地流 Stream 对象通过 publish() 方法发布本地音视频流。
  localStream = null
  clientConfig = null
  roomId = 0
  joined = false

  constructor(userId) {
    this.userId = userId

    this.init()
  }

  // 1.初始化
  // 检测环境，生成key，生成client对象
  init() {
    if (this.checkSystemRequirements()) {
      this.generatorKey()
      this.createClient()
      this.bindListeners()
    }
  }

  // 2.client 加入一个音视频通话房间。
  // number | string
  async TRTCJoin(roomId) {
    if(this.joined){
      return
    }
    try {
      if (roomId) {
        await this.client.join({ roomId })
        console.log(`5===================加入房间${roomId}`)
      } else {
        this.randomRoomId()
        await this.client.join({ roomId: this.roomId })
        console.log(`5===================加入房间${this.roomId}`)
      }

      await this.TRTCPublish()
      this.joined = true
    } catch (error) {
      console.error('Join room failed: ' + error)
    }
  }

  // 3.===================== 发布本地流

  // 初始化localStream
  async TRTCPublish() {
    console.log('3===================初始化localStream')
    this.localStream = TRTC.createStream({
      video,
      audio
    })

    await this.localStreamInitialize()
    if(!this.joined){
      await this.clientPublish()
    }
  }

  // 初始化本地音视频流对象
  async localStreamInitialize() {
    try {
      await this.localStream.initialize()
      console.log('4===================initialize初始化本地音视频流对象成功')
    } catch (error) {
      this.handleInitializeError(error)
    }
  }

  // 处理初始化本地音视频流错误
  handleInitializeError(error) {
    switch (error.name) {
      case 'NotFoundError':
        console.log('找不到满足请求参数的媒体类型')
        break
      case 'NotAllowedError':
        console.log('用户拒绝了当前的浏览器实例的访问音频、视频、屏幕分享请求。')
        break
      case 'NotReadableError':
        console.log(
          '尽管用户已经授权使用相应的设备，但是由于操作系统上某个硬件、浏览器或者网页层面发生的错误导致设备无法被访问。'
        )
        break
      case 'OverConstrainedError':
        console.log('cameraId/microphoneId 参数的值无效	')
        break
      case 'AbortError':
        console.log('由于某些未知原因导致设备无法被使用	')
        break
    }
  }

  // 本地流初始化成功，发布本地流
  async clientPublish() {
    try {
      await this.client.publish(this.localStream)
      await this.play()
      console.log('6===================本地流发布成功')
    } catch (error) {
      this.handleInitializeError(error)
    }
  }

  // 3.===================== 发布本地流

  // 4==============订阅远端流
  bindListeners() {
    this.client.on('peer-join', ()=> {
      console.log('====================peer-join')
    })

    this.client.on('peer-leave', ()=> {
      console.log('====================peer-leave')
    })

    // 监听远端流增加事件 
    this.client.on('stream-added', (event)=> {
      console.log('====================stream-added')
      const remoteStream = event.stream;

      // 订阅远端流音视频
      this.client.subscribe(remoteStream)
    })

    this.client.on('stream-subscribed', (event)=> {
      console.log('订阅成功提示===========stream-subscribed')
      const remoteStream = event.stream
      const id = remoteStream.getId()
            
      TRTCClass.remoteArr.push(id)
      remoteStream.play('remote_stream_' + id + '')
    })


    
  }
  // 4==============订阅远端流

  // 播放音视频流
  async play() {
    try {
      await this.localStream.play('local_stream')
      console.log('播放音视频流')
    } catch (error) {
      const errorCode = error.getCode()
      if (errorCode === 0x4043) {
        // PLAY_NOT_ALLOWED,引导用户手势操作并调用 stream.resume 恢复音视频播放
        this.localStream.resume()
      }
    }
  }
  

  // 5================取消发布本地流
  async TRTCUnpublish(){
    await this.client.unpublish()
    await this.client.leave()
    this.joined = false
  }
  // 5================取消发布本地流



  // ============================= 工具方法
  // 环境检测
  async checkSystemRequirements() {
    // v4.7.0 及其以上版本的 SDK
    const checkResult = await TRTC.checkSystemRequirements()

    if (!checkResult.result) {
      console.log('checkResult', checkResult.result, 'checkDetail', checkResult.detail)
      // SDK 不支持当前浏览器，根据用户设备类型建议用户使用 SDK 支持的浏览器
      return false
    } else {
      console.log('checkResult', checkResult.result, 'checkDetail', checkResult.detail)
      console.log('环境检测成功')
      return true
    }
  }

  // 生成key
  generatorKey() {
    if (this.userId) {
      console.log('1===================生成key')
      this.clientConfig = genSig(this.userId)
    }
  }

  // 初始化client
  createClient() {
    if (this.clientConfig) {
      console.log('2===================初始化client')
      this.client = TRTC.createClient(this.clientConfig)
      console.log(this.clientConfig)
    }
  }

  // 随机生成房间号取值要求为 [1, 4294967294] 的整数;
  randomRoomId() {
    const str = Date.now().toString()
    const id = str.substr(-3)
    let r1 = Math.floor(Math.random() * 10)
    const r2 = Math.floor(Math.random() * 10)

    while (r1 === 0) {
      r1 = Math.floor(Math.random() * 10)
    }

    const result = '' + r1 + r2 + id
    this.roomId = Number(result)
  }
  // ============================= 工具方法
}
